Java Hibernate和JPA注释-保留短语列表

Java Hibernate和JPA注释-保留短语列表,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我在使用hibernate持久化一个简单的java对象时遇到了问题,该对象只包含一个字符串形式的短语列表。 要将其存储在MySql数据库中,我有两个表: 短语列表-列: 组id、短语id、列表位置(它们共同构成主键;短语表中的短语id也有外键约束) 短语-列:短语\u id,短语(短语是具有唯一索引的varchar) 我希望能够简单地对包含短语列表的对象进行注释,以便将其持久化,但我尝试过的任何方法都不起作用,我尝试过使用@ElementCollection和@OneToMany与另一个表示短语

我在使用hibernate持久化一个简单的java对象时遇到了问题,该对象只包含一个字符串形式的短语列表。 要将其存储在MySql数据库中,我有两个表:

短语列表-列: 组id、短语id、列表位置(它们共同构成主键;短语表中的短语id也有外键约束)

短语-列:短语\u id,短语(短语是具有唯一索引的varchar)

我希望能够简单地对包含短语列表的对象进行注释,以便将其持久化,但我尝试过的任何方法都不起作用,我尝试过使用@ElementCollection和@OneToMany与另一个表示短语的实体一起使用的示例和变体,但无论我尝试了什么,我似乎都无法实现这一点

例如,短语列表:{“a”、“b”、“b”}将存储为:

**(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映射到一组相对固定的几十万个短语)。