当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring-JPA和HiberNate声明具有@OneTo众多和@ManyToOne注释的数据库映射

燕宜修
2023-03-14

假设我有以下商业模式:

用户最多有n辆车。

这是我为用户提供的DAO/域类:

@Entity
@Table(name="USER")
public @Data class User extends AbstractPersistable<Long> {
    @OneToMany(cascade=CascadeType.PERSIST, mappedBy="owner")
    private Set<Vehicle> vehicles = new HashSet<Vehicle>();
}

这是车辆的等级:

@Entity
@Table(name="VEHICLE")
public @Data class Vehicle extends AbstractPersistable<Long> {
    @ManyToOne(optional = false)
    @JoinColumn(name = "user_id")
    User owner;
}

我希望能够为这样的新用户保存新车辆:

User user = new User();
user.setName("Fred"); // other setters omitted

Vehicle vehicle = new Vehicle();
vehicle.setEngine("..."); // other setters omitted 

user.getVehicles().add(vehicle);
userService.saveUser(user);

userService.saveUser()是一个服务层方法,被注释为@Transactional并调用userRepository.save(user);(参见底部的Repository类摘录)

现在有几个问题,因为我的解决方案没有像预期的那样工作:

1.是否可以只保存用户对象,并将车辆设置在用户对象内自动保存
2。这是最佳实践吗?我知道用户是所有者。我希望在删除用户时删除用户的所有车辆
3。还是我总是要做一些像汽车之类的事情。setOwner(用户)
4。从你的角度来看,什么是最佳解决方案?

我读了很多关于拥有实体和JoinCol列/mappdBy的文章。然而现在我比以前更困惑了。

此外,这是我的用户库的摘录:

import org.springframework.data.jpa.repository.JpaRepository;
import org.myproject.domains.User;

public interface UserRepository extends JpaRepository<User, Long> { 
User findByLoginName(String loginName); 
}

共有2个答案

臧俊杰
2023-03-14

cascade类型。持续持续车辆如果只有持续情况,则设置。

我建议您使用CascateType. ALL。因此,当您删除用户时,车辆将被删除,如果您更新/持久化用户,车辆将被更新/持久化。

vehicle.set所有者(用户)是必要的,如果你想访问用户从车辆。

澹台文博
2023-03-14

您当然需要在车辆实体的对象中设置用户的引用,否则Hibernate将无法识别该关系。

另外,我建议使用@OneTo许多

  • cascade=cascade类型。所有用于正确的级联操作(请注意,通常您根本不会与用户分开触摸车辆
 类似资料:
  • 我试图建立简单的一对多关系,但hibernate抛出了错误,不知道该怎么办。 类产品: 和类用户: 我遇到了错误:通过JDBC语句执行DDL“alter table products drop constraint fk_user”时出错

  • 问题内容: 我正在尝试配置Spring + Hibernate + JPA以使用两个数据库(MySQL和MSSQL)。 我的datasource-context.xml: 每个persistence.xml包含一个单元,如下所示: PersistenceUnitManager导致以下异常: 如果只留下一个没有列表的persistence.xml,则每个列表都可以正常工作,但我需要2个单元… 我还尝

  • 每个租户都有自己的数据库,可以更详细地处理用户,并且需要有一个中央数据库来处理: 代币(OAuth2) 我已经找到了多租户的解决方案,它允许我根据用户确定数据源。然而,我不确定如何将某些crud存储库链接到这个中心数据源,而将其他存储库链接到可变数据源。 另一个解决方案涉及更新属性文件,并使用配置服务器(即通过git)来触发@ReresScope注释配置。虽然我不确定这是否适用于数据源,或者这是否

  • 我需要一个概念来设计一个使用Spring boot、Hibernate和JPA的多数据库应用程序。 目前我正在考虑支持4个关系数据库(Mysql,H2,SQLLite,Oracle)。 我所做的是使用spring boot profile特性选择正确的数据库profile,然后加载相关的数据库属性。

  • 我想知道我应该怎么做,因为我读了很多文章试图理解这一点,包括很多问题。我读过的书中,没有一本是非常中肯的。 我想知道当使用级联规则以及应用程序定义数据库时会发生什么,因为这将定义我应该采用以下方法还是其他方法。 如果我现在对对象调用删除操作(无论是通过还是),会发生以下哪种情况? > hibernate操作将删除已加载到会话缓存中的所有相应条记录(可能是也可能不是实际数据库中存在的所有条记录),然

  • 问题内容: 我必须在Hibernate,Jpa的应用程序(弹簧)中使用两个不同的数据库。我想直接将不同的表定义为不同的数据源。所以我使用两个不同的持久性单元,然后尝试使用 和 将不同的表放入不同的包中。但这不起作用。用第一个数据源来影响所有表。然后我尝试将诸如类的名称写入持久性XML文件 和it.two.app.domain.second.OtherTable 但是,当我运行Log时,说表’fir