我被这个问题困扰了。数据库架构是由其他人提供的,因此我不能简单地更改名称。我尝试在各处添加正确的注释,也许我遗漏了一些东西(明显的)?
这是我的完整映射(相当多的类),我将提交 getter/setter。
问题是当休眠试图获取所有List<ControlRuleAttrib> controlRuleAttribs
控制规则
@Entity
@Table(name = "CONTROL_RULE")
public class ControlRule implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CONTROL_RULE_ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinColumn(name = "CONTROL_RULE_TYPE_ID")
@ForeignKey(name = "CONTROL_RULE_TYPE_ID")
private ControlRuleType controlRuleType;
@Column(name = "JOB_NM")
private String jobname;
@Column(name = "LIBRARY_NM")
private String libraryname;
@Column(name = "TABLE_NM")
private String tablename;
@Column(name = "COLUMN_NM")
private String columnname;
@OneToMany(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinTable(name = "CONTROL_RULE_ATTRIB", joinColumns = {
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
})
private List < ControlRuleAttrib > controlRuleAttribs;
}
控制规则属性
@Table(name = "CONTROL_RULE_ATTRIB")
@Entity
public class ControlRuleAttrib {
@EmbeddedId
private ControlRuleAttribPK controlRuleAttribPK;
@Column(name = "ATTRIBUTE_VALUE")
private String attributeValue;
}
ControleRuleAttribPK这里的问题是,是否有可能以某种方式获得实体ControlRuleAttribType
from ControlRuleAttrib
?正如你在下面看到的ControlRuleAttribTypeId
的 ID 是ControleRuleAttribType
。我想获得整个对象而不是整数。
@Embeddable
public class ControlRuleAttribPK implements Serializable {
@Column(name = "CONTROL_RULE_ID")
private Long controlRuleId;
@Column(name = "ATTRIBUTE_SEQ_NUM")
private Integer attributeSeqNum;
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID")
private Integer controlRuleAttribTypeId;
}
ControleRuleAttribType
@Entity
@Table(name = "CONTROL_RULE_ATTRIB_TYPE")
public class ControlRuleAttribType implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_ID")
private Integer id;
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_NM")
private String typename;
@Column(name = "CONTROL_RULE_ATTRIB_TYPE_DESC")
private String typedesc;
@ManyToOne(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinColumn(name = "CONTROL_RULE_TYPE_ID")
@ForeignKey(name = "CONTROL_RULE_TYPE_ID")
private ControlRuleType controlruletype;
}
控制规则类型
@Entity
@Table(name = "CONTROL_RULE_TYPE")
public class ControlRuleType implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CONTROL_RULE_TYPE_ID")
private Integer id;
@Column(name = "CONTROL_RULE_TYPE_NM")
private String typename;
@Column(name = "CONTROL_RULE_TYPE_DESC")
private String typedesc;
}
EDIT
这是堆栈跟踪:
https://gist.github.com/a30dd9ce534d96bb9a97
您会发现,它在这里失败了:
在
com.execon.controllers.main.MainPageController.getMainPage(MainPageController.java:33)
[课程:]
就是这样:
List<ControlRule> list = SessionFactoryUtils.openSession(
sessionFactory ).createQuery( "from ControlRule" ).list();
System.out.println( list );
我添加的映射的每个对象都有toString()
方法声明如下:
@Override
public String toString()
{
String s = "ControlRule{";
s += "id=" + id.toString();
s += ", controlRuleType=" + controlRuleType;
s += ", jobname='" + jobname + '\'';
s += ", libraryname='" + libraryname + '\'';
s += ", tablename='" + tablename + '\'';
s += ", columnname='" + columnname + '\'';
s += ", controlRuleAttribs=" + controlRuleAttribs;
s += '}';
return s;
}
和休眠请求:
https://gist.github.com/c8584113522757a4e0d8/4f31dc03e7e842eef693fa7ba928e19d27b3ca26
请帮助 :)
EDIT 2
阅读@Jens 的回答后,我对代码做了一些更改。首先我按照你写的做了,但出现了错误:
org.hibernate.AnnotationException:外键引用
com.execon.models.controlrules.ControlRuleAttrib 来自
com.execon.models.controlrules.ControlRule 的数量错误
柱子。应该是 3
我想这是对的,因为我有复合主键。
然后我尝试了这样的方法:
@OneToMany(fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
@JoinTable(name = "CONTROL_RULE_ATTRIB",
joinColumns = {
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
},
inverseJoinColumns = {
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false),
@JoinColumn(name = "CONTROL_RULE_ATTRIB_TYPE_ID", nullable = false, updatable = false),
@JoinColumn(name = "ATTRIBUTE_SEQ_NUM", nullable = false, updatable = false)
})
private List<ControlRuleAttrib> controlRuleAttribs;
非常接近,但它给了我以下例外:
集合映射中的重复列..
所以最后我删除了
joinColumns =
{
@JoinColumn(name = "CONTROL_RULE_ID", nullable = false, updatable = false)
}
所有内容均已编译,除了当我尝试访问集合时,Hibernate 正在执行以下查询:
https://gist.github.com/c88684392f0b7a62bea5
最后一行是controlrul0_.CONTROL_RULE_CONTROL_RULE_ID=?
虽然应该是controlrul0_.CONTROL_RULE_ID=?
.
无论如何我可以让它发挥作用吗? :/