我与Jpa一起使用springboot(spring-boot-starter-父2.3.0版本)。我有作为父实体的User类和作为子实体的UserEmails。
用户实体
@Entity
@Table(name = "user")
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotEmpty(message = "Name cannot be empty")
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JsonManagedReference
private List<UserEmails> userEmails = new ArrayList<UserEmails>();
//setters and getters
public void setUserEmails(List<UserEmails> userEmails) {
this.userEmails= userEmails;
this.userEmails.forEach(userEmail->{
userEmail.setUser(this);
});
}
}
用户角色实体
@Entity
@Table(name = "user_emails")
public class UserEmails extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name="email")
private String email;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id" , referencedColumnName = "id", nullable=true)
private User user;
//getters and setters
}
问题是,即使我在关系的两边都使用fetch类型作为懒惰,但当我调用getUserById或getAllUsers时,jpa也会加载用户电子邮件。
用户服务简介
@Service
public class UserServiceImpl extends BaseServiceImpl implements UserService {
private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
UserDAO userDAO;
@Override
public User getUserById(int id) {
logger.info("Executing getUserById() in user service");
User user = null;
try {
user = userDAO.findById(id);
} catch (DataAccessException e) {
String message = "Some message"
throw new Exception(message, e);
}
if (user == null) {
String message = "Some message"
throw new ResourceNotFoundException(message);
}
return user;
}
}
UserDAO
@Repository
public interface UserDAO extends JpaRepository<User, Long>{
public User findById(int id);
}
是的,它可能会发生,如果您在一个控制器(例如<code>ResponseEntity)中使用持久化对象(在您的例子中是实例用户的对象)作为返回值,则会发生这种情况
你有两种可能:
> < li>
定义DTO对象,例如UserDTO,以及在的用户和UserDTO之间进行映射的映射器
要在用户
类中使用其他注释,如@jsonignoreperties和@JsonProperty:
@Entity
@Table(name = "user")
@JsonIgnoreProperties({"userEmails"})
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotEmpty(message = "Name cannot be empty")
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "user",fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JsonManagedReference
@JsonProperty("userEmails")
private List<UserEmails> userEmails = new ArrayList<UserEmails>();
//setters and getters
public void setUserEmails(List<UserEmails> userEmails) {
this.userEmails= userEmails;
this.userEmails.forEach(userEmail->{
userEmail.setUser(this);
});
}}
.
应用程序模块: app-routing.module.ts: 实体/实体-routing.module.ts: 实体/实体.组件. ts: 我还尝试使用以下方法在实体模块中定义路由,但组件仍会显示为导航到 /list,而不是 /entities/list。 我做错了什么?任何帮助是值得赞赏的!
Javers默认忽略而不是默认包含
我使用hibernate 5作为JPA实现,我有一个@OneToMany双向关系的问题。 这些是我的实体: 我希望这种关系在两个方向上都是惰性的,因为我想通过fetch JOIN手动获取数据,如下面的查询: 但我的问题是hibernate忽略了@ManyToOne(fetch=FetchType.LAZY),因此Jackson由于引用链的无限递归(StackOverflowerr)而中断,如下所示
描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l
问题内容: 如果这是完全相同的内容,请纠正我,我知道这个话题经常被讨论,但是找不到确切的答案。 问题: 在MVC Web应用程序中处理Hibernate对象的最佳实用解决方案是什么? 细节: 我正在使用Hibernate,并希望在可能的情况下利用延迟加载。 我正在使用MVC风格的Webapp。 我讨厌获得延迟加载初始化异常。 我讨厌不得不在事务之间重新连接Hibernate对象。 选项: 渴望装载
问题内容: 假设我有两个实体: 然后,我要保留“客户”实体,然后,参照先前添加的“客户”保留“订单”实体。当我从数据库中检索此客户并调用getOrders时,它将返回空集。这是正常行为吗?如果是,当我添加新的Order实体时,我该怎么做以自动刷新此集合? 问题答案: Jpa不会为您维护关系,因此应用程序需要设置双向关系的两端,以使它们与数据库保持同步。当您设置了order-> customer关系