【问题标题】:Map a list of strings with JPA/Hibernate annotations使用 JPA/Hibernate 注释映射字符串列表
【发布时间】:2010-10-22 05:36:18
【问题描述】:

我想做这样的事情:

    @Entity public class Bar {
        @Id @GeneratedValue long id;
        List<String> Foos
    }

并让 Foos 保存在这样的表中:

foo_bars (
    bar_id int, 
    foo varchar(64)
);

更新:

我知道如何映射其他实体,但在很多情况下这太过分了。如果不创建另一个实体或在某个 blob 列中结束所有内容,我的建议似乎是不可能的。

【问题讨论】:

    标签: java hibernate jpa annotations


    【解决方案1】:

    如果你使用 JPA2,你会这样做:

    @Entity public class Bar {
       @Id @GeneratedValue long id;
    
       @ElementCollection
       @CollectionTable(name="foo_bars", joinColumns=@JoinColumn(name="bar_id"))
       @Column(name="foo")
       List<String> Foos;
     }
    

    有关更清晰的示例,请参阅the Hibernate Annotations Reference Guide 中的第 2.2.5.3.3 节。

    【讨论】:

      【解决方案2】:

      这是Hibernate terms 中的“值集合”或“元素”。它有一个(Hibernate 特定的)注释。 JPA 不支持这个(目前)。

      简而言之,像这样注释您的收藏:

      @CollectionOfElements
      @JoinTable(
              table=@Table(name="..."),
              joinColumns = @JoinColumn(name="...") // References parent
      )
      @Column(name="...value...", nullable=false)
      

      这将创建具有外键和限制的必要表。

      【讨论】:

      【解决方案3】:

      如果您将列表存储为数组,它可以工作:

      setFoos(String[] foos);
      

      你可以这样变换它:

      setFoos(myList.toArray(new String[myList.size()]));
      

      【讨论】:

        【解决方案4】:

        创建一个实体“FooBars”

        将属性“Foos”重构为

        @OneToMany 列出Foos

        【讨论】:

        • 谢谢,迈克尔,但我希望在这里避免另一个实体。无论如何我真的只需要字符串。我希望让休眠来为我处理这一切。
        【解决方案5】:

        我认为这就是您所需要的:

        @Entity 
        public class Bar {
            @Id @GeneratedValue long id;
        
            @OneToMany(mappedBy="bar")   //"bar" = field name in mapping class
            List<FooBar> Foos;
        }
        
        @Entity 
        public class FooBar {
            @Id @GeneratedValue long id;
        
            @ManyToOne
            @JoinColumn(name="bar_Id")  
            Bar bar;
        }
        

        【讨论】:

        • 感谢 Vanger,但我希望在这里避免另一个实体。无论如何我真的只需要字符串。我希望让休眠来为我处理这一切。
        【解决方案6】:

        这里的'Foos'是字符串列表,所以它是单向的。 我们可以使用@ElementCollection 注解在一个模型类中做到这一点。

        @Entity 
        @Table(name="bar")
        public class Bar {
        
                @Id @GeneratedValue 
                long id;
        
                @ElementCollection
                @JoinTable(
                    name="foo_bars",
                    joinColumns = @JoinColumn( name="bar_id")
                  )
                @Column(name="foo")
                List<String> Foos;
            }
        

        在数据库中 bar_id 是 foo_bars 表中的外键

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 1970-01-01
          • 2010-10-29
          • 2017-06-06
          • 2013-11-25
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多