标签: hibernate-onetomany

如何在复合id键属性上映射"insert ='false'update ='false'",该属性也用于一对多FK?

我正在使用现有的数据库架构处理遗留代码库.现有代码使用SQL和PL/SQL在DB上执行查询.我们的任务是使项目数据库引擎不可知的一小部分(最初,最终改变一切).我们选择使用Hibernate 3.3.2.GA和"*.hbm.xml"映射文件(而不是注释).遗憾的是,更改现有架构是不可行的,因为我们无法回退任何遗留功能.

我遇到的问题是当我试图映射单向,一对多的关系时,FK 也是复合PK的一部分.这是类和映射文件......

CompanyEntity.java

public class CompanyEntity {
    private Integer id;
    private Set<CompanyNameEntity> names;
    ...
}
Run Code Online (Sandbox Code Playgroud)

CompanyNameEntity.java

public class CompanyNameEntity implements Serializable {
    private Integer id;
    private String languageId;
    private String name;
    ...
}
Run Code Online (Sandbox Code Playgroud)

CompanyNameEntity.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.example">

    <class name="com.example.CompanyEntity" table="COMPANY">
        <id name="id" column="COMPANY_ID"/>
        <set name="names" table="COMPANY_NAME" cascade="all-delete-orphan" fetch="join" batch-size="1" lazy="false">
            <key column="COMPANY_ID"/>
            <one-to-many entity-name="vendorName"/>
        </set>
    </class>

    <class entity-name="companyName" name="com.example.CompanyNameEntity" table="COMPANY_NAME">
        <composite-id>
            <key-property name="id" column="COMPANY_ID"/>
            <key-property name="languageId" …
Run Code Online (Sandbox Code Playgroud)

hbm hibernate-mapping hbmxml hibernate-onetomany

41
推荐指数
1
解决办法
13万
查看次数

JPA注释中的inverse = true

在我的应用程序中,我使用JPA 2.0和Hibernate作为持久性提供程序.我在两个实体之间有一对多的关系(使用@JoinColumn和不使用@JoinTable).我想知道如何在JPA注释中指定inverse=true(如指定hbm.xml)来反转关系所有者.

谢谢.

hibernate jpa inverse hibernate-onetomany

24
推荐指数
1
解决办法
3万
查看次数

TransientObjectException - 对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例

我遇到了一些问题的可能答案,但这是关于从Hibernate 3.4.0GA升级到Hibernate 4.1.8的问题.所以这曾经在以前的版本下工作,我已经搜索了为什么它在这个新版本中突破的原因.

我得到了

org.hibernate.TransientObjectException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.test.server.domain.model.NoteItem.note - > com.test.server.domain.model.Note

任何帮助都会很棒.

这是我的课程.

@MappedSuperclass
public abstract class EntityBase implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    protected Long id;

    @Version
    @Column(name = "VERSION")
    protected Long version; 

    public Long getId() {
        return id;
    }

    public Long getVersion() {
        return version;
    }

    protected static final EntityManager entityManager() {
        return EntityManagerUtil.getEntityManager();
    }
}

@Entity
@Table(name = "WORK_BOOK")
public class WorkBook extends EntityBase {
    private static …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa hibernate-onetomany

17
推荐指数
1
解决办法
8万
查看次数

Hibernate @OneToMany关系导致JSON结果中的无限循环或空条目

我有两个实体,一个实体"电影"和一个实体"剪辑"每个剪辑属于一个电影,一个电影可以有多个剪辑.

我的代码看起来像:

Movie.java
    @OneToMany(mappedBy = "movie", targetEntity = Clip.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Clip> clips = new HashSet<Clip>();



 Clip.java

    @ManyToOne
        @JoinColumn(name="movie_id")
        private Movie movie;
Run Code Online (Sandbox Code Playgroud)

正在生成表,每个Clip都有一个列"movie_id"但这会导致我的应用程序在我请求数据时最终处于无限循环中

    @Path("/{id:[0-9][0-9]*}")
        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public Movie lookupMovieById(@PathParam("id") long id) {
            return em.find(Movie.class, id);
        }


result:
{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"MGS Walkthrough P1","keywords":null,"movie":{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1,"name":"Walkthrough"}],"clips":[{"id":1,"version":1,"name":"M...
Run Code Online (Sandbox Code Playgroud)

当我请求剪辑时,结果相同.

当我将它改为@ManyToMany关系时,不会有任何类似的问题,但这不是我在这里需要的.你能帮助我吗?将fetchType设置为Lazy不起作用.

编辑:我正在使用当前的JBoss开发工作室

编辑:

通过阅读本文,我"解决了"这个问题:

http://blog.jonasbandi.net/2009/02/help-needed-mapping-bidirectional-list.html

"要将双向一个映射到多个,一对多一侧作为拥有方,您必须删除mappedBy元素并将多个@JoinColumn设置为可插入且可更新为false.此解决方案显然未进行优化并会产生一些额外的UPDATE语句."

当我要求电影时,我得到以下答案:

{"id":1,"version":1,"name":"MGS Walkthrough","filename":"video.mp4","movieCategories":[{"id":1,"version":1, "名称":"演练"}],"剪辑":[],"说明":"预告片zu mgs4"}

条目"剪辑"仍然出现.这仍然是错误的解决方案还是我必须忍受这个?

json hibernate one-to-many hibernate-onetomany

15
推荐指数
3
解决办法
2万
查看次数

为什么hibernate为单向OneToMany创建连接表?

为什么hibernate为这些类使用连接表?

@Entity
public class CompanyImpl {
    @OneToMany
    private Set<Flight> flights;


@Entity
public class Flight {
Run Code Online (Sandbox Code Playgroud)

我既不想要连接表也不想要双向关联:(

hibernate hibernate-onetomany

12
推荐指数
2
解决办法
6114
查看次数

一对多关联 - 在JPA中连接具有非主键列的表

我正在研究遗留系统,需要从数据库中读取一些信息.以下是表格关系

供应商(vendorId - pk,vendorEid,name)
VendorContactBridge(bridgeId -pk,vendorEid,contactEid)
联系人(contactId -pk,contactEid,phone)

vendorEid和contactEid不是表的主键,而是用作Join表VendorContactBridge中的连接列.

供应商实体 -

@Entity
@Table(name="Vendor")
public class Vendor implements Serializable{

@Id
@Column(name="VENDORID")
private BigDecimal vendorId;

@Column(name="VENDOREID")
private BigDecimal vendorEid;

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")},
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")})
private Set<Contact> vendorContact;
}
Run Code Online (Sandbox Code Playgroud)

联系实体 -

@Entity
@Table(name="CONTACT")
public class Contact implements Serializable{

@Id
@Column(name="CONTACTID")
private BigDecimal contactId;

@Column(name="CONTATEID")
private BigDecimal contactEId;

@ManyToOne
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")},
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")})
private Vendor vendor;
 }
Run Code Online (Sandbox Code Playgroud)

在运行查询时,获得以下异常

SecondaryTable JoinColumn无法引用非主键.

我删除了我在供应商实体中提供的Eager fetch,我没有得到任何异常,但它没有加载集合.关联有什么问题?

hibernate jpa one-to-many hibernate-onetomany

9
推荐指数
1
解决办法
2万
查看次数

不要使用cascade ="all-delete-orphan"更改对集合的引用

我收到一个错误:

不要使用cascade ="all-delete-orphan"更改对集合的引用

在尝试以下操作时:

beginTx();
Parent parent = new Parent();
Child child = new Child();
parent.addChild(child);
getSession().save(parent);
commitTx();
closeSession();

beginTx();
//id is the primary key
child.setID(null);
getSession().update(child);
commitTx();
closeSession();
Run Code Online (Sandbox Code Playgroud)

父母和孩子通过one-to-manycascade =' all-delete-orphan'相关联.

class Parent {
Set child;
}


<set name="child" table="Child" cascade="all-delete-orphan" inverse="true">
    <key column="FK"></key>
    <one-to-many class="Child"/>
</set>
Run Code Online (Sandbox Code Playgroud)

知道为什么会抛出这个异常吗?为什么即使实体处于分离状态,在主键上设置null也会导致此异常?

java hibernate hibernate-onetomany

8
推荐指数
1
解决办法
2万
查看次数

Hibernate具有连接类级联问题的多对多问题

我和Many-to-Many班级之间有关系.因为我想获得有关辅助表的其他信息,所以我必须创建一个帮助类,如下所述:使用JPA和Hibernate时,使用额外列映射多对多关联的最佳方法FooBarFooBar

我创建了一个Foo,并创建了一些条形图(保存到DB).当我然后使用其中一个条添加到foo

foo.addBar(bar);            // adds it bidirectionally
barRepository.save(bar);    // JpaRepository
Run Code Online (Sandbox Code Playgroud)

然后创建FooBar的DB条目 - 正如预期的那样.

但是,当我想再次从foo中删除相同的栏时,使用

foo.removeBar(bar);         // removes it bidirectionally
barRepository.save(bar);    // JpaRepository
Run Code Online (Sandbox Code Playgroud)

然后,不会从数据库中删除先前创建的FooBar条目.通过调试,我看到foo.removeBar(bar);确实删除了双向.没有异常被抛出.

难道我做错了什么?我很确定它与Cascading选项有关,因为我只保存吧.


我尝试过的:

  • 添加orphanRemoval = true@OneToMany - 注释,但没有用.我认为这是正确的,因为我不删除 Foo和Bar,只删除他们的关系.

  • 从@OneToMany注释中排除CascadeType.REMOVE,但与orphanRemoval相同我认为这不适用于这种情况.


编辑: 我怀疑在我的代码或模型中必须有一些东西与我的orphanRemoval混淆,因为现在已有2个答案说它有效(带orphanRemoval=true).

最初的问题已得到解答,但如果有人知道什么可能导致我的孤儿无法工作,我会非常感谢您的意见.谢谢


代码:Foo,Bar,FooBar

public class Foo {

    private Collection<FooBar> fooBars = new HashSet<>();

    // constructor omitted for brevity

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "foo", fetch = FetchType.EAGER)
    public Collection<FooBar> getFooBars() …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa cascade hibernate-onetomany

6
推荐指数
1
解决办法
155
查看次数

Hibernate分页OneToMany关系

如何在Hibernate中映射一对多关系,其中多方需要进行分页?(即你有数百个或更多的相关对象)
使用OneToMany批注(或其xml等价物)是没用的,因为加载单方对象会检索所有相关对象导致内存灾难(即使你使用延迟加载) .
一种可能的方法(我已经在使用)是在DAO实现中添加一个getter方法,您可以在其中引入分页参数.但是,我可以看到这并不理想,因为你失去了一些功能,比如级联(例如,我必须在DAO类中包含setter方法来关联对象).此外,您失去了一些OOP意识,因为单侧对象没有检索其相关多方对象的方法.什么是最好的解决方案?
为了进一步说明我的观点,假设我有两个类,它们之间有以下关系:A有很多B.
我不能使用OneToMany注释编写A.getAllB()方法,因为有数百个B与之相关因此,为了对结果进行分页,我使用getAllB()方法创建了一个单独的ADaoImpl类,其中我可以包含分页参数,一次只返回一页数据.它是否正确?任何帮助将不胜感激.

hibernate hibernate-onetomany

5
推荐指数
1
解决办法
697
查看次数

saveorupdate() 不更新休眠中的集合(列表)一对多映射

班级 Student

public class Student {

private Long id;
private String name;
private String className;
private List<Phone> phones;
    // getter setter
 }
Run Code Online (Sandbox Code Playgroud)

班级 Phone

public class Phone {

private Long id;
private String number;
   //getter setter
     }
Run Code Online (Sandbox Code Playgroud)

-> 映射文件 Student.hbm.xml

     <id name="id" type="long" column="id">
        <generator class="native" />
    </id>

    <property name="name" column="name" type="string" />

    <property name="className" column="class_name" type="string" />

    <list name="phones" cascade="all-delete-orphan">
        <key column="student_id"/>
        <list-index column="idx" />
        <one-to-many class="Phone" />
    </list>
Run Code Online (Sandbox Code Playgroud)

-> 映射文件 Phone.hbm.xml

    <id name="id" type="long" column="id">
        <generator class="native" /> …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-mapping hibernate-onetomany

5
推荐指数
1
解决办法
8733
查看次数