1

我有两个名为 User 和 Competencia 的类。我想在他们之间建立关系,但它不起作用。看:

public class User extends Model{

}

@Table(value = "competencias")
@BelongsTo(foreignKeyName = "user_id", parent = User.class)
public class Competencia extends Model{

}
CREATE TABLE competencias(
  id INTEGER NOT NULL DEFAULT NEXTVAL('competencias_id_seq'::regclass),
  mes CHARACTER(2) NOT NULL,
  ano CHARACTER(4) NOT NULL,
  created_at DATE NOT NULL DEFAULT now(),
  user_id INTEGER NOT NULL,
  ativo BOOLEAN,
  CONSTRAINT pk_competencia PRIMARY KEY (id),
  CONSTRAINT fk_competencia_operador FOREIGN KEY (user_id) REFERENCES public.users (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT uk_mes_ano UNIQUE (mes, ano)
)

CREATE TABLE users(
  id INTEGER NOT NULL DEFAULT NEXTVAL('operadores_id_seq'::regclass),
  nome CHARACTER VARYING(25) NOT NULL,
  email CHARACTER VARYING(100) NOT NULL,
  senha CHARACTER VARYING(120) NOT NULL,
  nivel INTEGER NOT NULL DEFAULT 4,
  ativo BOOLEAN,
  created_at DATE DEFAULT now(),
  nome_completo CHARACTER VARYING(60) NOT NULL,
  CONSTRAINT pk_operadores PRIMARY KEY (id),
  CONSTRAINT unique_login UNIQUE (nome)
);

错误信息:

Exception in thread "AWT-EventQueue-0"  org.javalite.activejdbc.associations.NotAssociatedException: No association from table 'competencias' to table 'users'

完整的堆栈跟踪:

Exception in thread "AWT-EventQueue-0" org.javalite.activejdbc.associations.NotAssociatedException: No  association from table 'competencias' to table 'users'
at org.javalite.activejdbc.Model.add(Model.java:2421)

Exception in thread "AWT-EventQueue-0" org.javalite.activejdbc.associations.NotAssociatedException: No association from table 'competencias' to table 'users'
at org.javalite.activejdbc.Model.add(Model.java:2421)
at ui.DialogCompetencia.btSalvarActionPerformed(DialogCompetencia.java:261)
at ui.DialogCompetencia.access$800(DialogCompetencia.java:23)
at ui.DialogCompetencia$10.actionPerformed(DialogCompetencia.java:224)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:184)
at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:229)
at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:227)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:227)
at java.awt.Dialog.show(Dialog.java:1084)
at java.awt.Component.show(Component.java:1673)
at java.awt.Component.setVisible(Component.java:1625)
at java.awt.Window.setVisible(Window.java:1014)
at java.awt.Dialog.setVisible(Dialog.java:1005)
at ui.Menu.jMenuItem2ActionPerformed(Menu.java:207)
at ui.Menu.access$100(Menu.java:11)
at ui.Menu$2.actionPerformed(Menu.java:99)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

方法代码:

User user = User.findById(usuario.getId());
Competencia competencia = new Competencia();
competencia.set("id", id);
competencia.set("mes", String.format("%02d", comboMes.getSelectedIndex()));
competencia.set("ano", comboAno.getSelectedItem().toString());
competencia.set("ativo", checkAtivo.isSelected());
**competencia.add(user);**
if(competencia.isValid()){
  if(competencia.saveIt()){
    Functions.informacao("Competencia gravada");
    labelCodigo.setText(String.format("%04d", competencia.getId()));
    preparaForm("salvar");
  }
}else{
  String message = showInfo(competencia);
  JOptionPane.showMessageDialog(this, message, "Corrija os erros abaixo:", JOptionPane.ERROR_MESSAGE);      
}
4

1 回答 1

2

我还不确定真正的问题是什么,因为您没有提供日志输出,但您的模型Competencia不应该有注释:

@BelongsTo(foreignKeyName = "user_id", parent = User.class)

因为你遵守约定。此外,请包括整个堆栈跟踪,而不是第一行,因为它包含有用的信息。

更新:

根据您的表结构,您有一个一对多的关系,其中一个用户有许多 Competencias。

但是,您正在向能力添加许多用户:

competencia.add(user);

Competencia 没有用户,反之亦然!一个用户有很多能力。此代码将起作用:

user.add(competencia);

换句话说,您颠倒了父/子关系。

于 2016-05-28T02:10:37.983 回答