Java Hibernate和JPA注释-保留短语列表
我在使用hibernate持久化一个简单的java对象时遇到了问题,该对象只包含一个字符串形式的短语列表。 要将其存储在MySql数据库中,我有两个表: 短语列表-列: 组id、短语id、列表位置(它们共同构成主键;短语表中的短语id也有外键约束) 短语-列:短语\u id,短语(短语是具有唯一索引的varchar) 我希望能够简单地对包含短语列表的对象进行注释,以便将其持久化,但我尝试过的任何方法都不起作用,我尝试过使用@ElementCollection和@OneToMany与另一个表示短语的实体一起使用的示例和变体,但无论我尝试了什么,我似乎都无法实现这一点 例如,短语列表:{“a”、“b”、“b”}将存储为:Java Hibernate和JPA注释-保留短语列表,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我在使用hibernate持久化一个简单的java对象时遇到了问题,该对象只包含一个字符串形式的短语列表。 要将其存储在MySql数据库中,我有两个表: 短语列表-列: 组id、短语id、列表位置(它们共同构成主键;短语表中的短语id也有外键约束) 短语-列:短语\u id,短语(短语是具有唯一索引的varchar) 我希望能够简单地对包含短语列表的对象进行注释,以便将其持久化,但我尝试过的任何方法都不起作用,我尝试过使用@ElementCollection和@OneToMany与另一个表示短语
**(phrase table)** **(phrase_list table)**
phrase_id phrase group_id phrase_id list_position
1 'a' 1 1 0
2 'b' 1 2 1
1 2 2
以下是我认为可行的尝试;我添加了一个额外的id字段,因为我看不到使用外键作为id的一部分的方法,并且用@id注释列表是不起作用的
@Entity @Table(name = "phrase_list")
public class PhraseList {
@ElementCollection
@CollectionTable(
name="phrase",
joinColumns=@JoinColumn(name="phrase_id")
)
@OrderColumn(name="list_position")
@Column(name="phrase")
private List<String> phrases;
@Id @GeneratedValue
@Column(name = "list_id")
private Long id;
@Column(name = "goup_id")
private Long groupId;
public void setResults(List<String> results){
this.results = results;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
}
@Entity@Table(name=“短语列表”)
公共课堂用语表{
@元素集合
@收集表(
name=“短语”,
joinColumns=@JoinColumn(name=“phrase_id”)
)
@OrderColumn(name=“列表位置”)
@列(name=“短语”)
私人列表短语;
@Id@GeneratedValue
@列(name=“list\u id”)
私人长id;
@列(name=“goup\u id”)
私有长groupId;
公共void setResults(列出结果){
这个结果=结果;
}
public void setGroupId(整数groupId){
this.groupId=groupId;
}
}
我得到一个例外:
org.hibernate.engine.jdbc.spi.SqlExceptionHelper日志异常
错误:无法添加或更新子行:外键约束失败(删除时测试db
phrase\u list,约束
fk\u phrase\u list\u id外键(
phrase\u id)引用
phrase(
phrase\u id`)更新时不执行任何操作)
有没有办法通过简单地注释普通Java对象来实现这一点?如果不是,实现这一目标的最佳方式是什么
如果我不能让它使用注释,我可能会编写自定义查询和/或用于持久化对象的专用方法。例如,一个与特定类耦合的方法,它知道如何持久化其对象,我希望避免这种情况。我认为您不应该与所有这些ID发生冲突。检查一下它也使用了一个简单类型的列表。谢谢,这个例子不是我想要的,但是帮助我认识到为什么我所做的不起作用。我想从一组独特的短语中创建列表(防止每次应用程序运行时重新添加200万个短语,这些短语大部分是重复的-相反,这将是200万行通过其ID映射到一组相对固定的几十万个短语)。