Java有transient关键字。为什么JPA有@Transient而不是简单地使用已经存在的java关键字?
当前回答
通俗地说,如果在实体的属性上使用@Transient注释:该属性将被单独挑选出来,不会保存到数据库中。实体内对象的其余属性仍将被保存。
我保存对象到数据库使用jpa存储库内置的保存方法,这样:
userRoleJoinRepository.save(user2);
其他回答
通俗地说,如果在实体的属性上使用@Transient注释:该属性将被单独挑选出来,不会保存到数据库中。实体内对象的其余属性仍将被保存。
我保存对象到数据库使用jpa存储库内置的保存方法,这样:
userRoleJoinRepository.save(user2);
对于Kotlin开发人员,请记住Java transient关键字将成为内置的Kotlin @Transient注释。因此,如果您在实体中使用JPA @Transient,请确保您有JPA导入:
import javax.persistence.Transient
目的不同:
transient关键字和@Transient注释有两个不同的目的:一个处理序列化,一个处理持久性。作为程序员,我们经常把这两个概念结合在一起,但这通常是不准确的。持久性是指状态的特性,它比创造它的过程更持久。Java中的序列化是指将对象的状态编码/解码为字节流的过程。
关键字transient是一个比@Transient更强的条件:
如果字段使用了transient关键字,当对象转换为字节流时,该字段将不会被序列化。此外,由于JPA将标记有transient关键字的字段视为具有@Transient注释,因此JPA也不会持久化该字段。
另一方面,当对象被序列化时,单独带注释的@Transient字段将被转换为字节流,但JPA不会持久化它。因此,瞬态关键字是比@Transient注释更强的条件。
例子
This begs the question: Why would anyone want to serialize a field that is not persisted to the application's database? The reality is that serialization is used for more than just persistence. In an Enterprise Java application there needs to be a mechanism to exchange objects between distributed components; serialization provides a common communication protocol to handle this. Thus, a field may hold critical information for the purpose of inter-component communication; but that same field may have no value from a persistence perspective.
例如,假设在服务器上运行一个优化算法,并假设该算法需要几个小时才能完成。对于客户来说,拥有最新的解决方案集非常重要。因此,客户端可以订阅服务器,并在算法执行阶段定期接收更新。这些更新是使用ProgressReport对象提供的:
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
Solution类可能看起来像这样:
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
服务器将每个ProgressReport保存到它的数据库中。服务器并不关心如何持久化estimatedMinutesRemaining,但是客户端肯定关心这个信息。因此,estimatedMinutesRemaining使用@Transient进行注释。当最终的解决方案由算法定位时,它将由JPA直接持久化,而不使用ProgressReport。
I will try to answer the question of "why". Imagine a situation where you have a huge database with a lot of columns in a table, and your project/system uses tools to generate entities from database. (Hibernate has those, etc...) Now, suppose that by your business logic you need a particular field NOT to be persisted. You have to "configure" your entity in a particular way. While Transient keyword works on an object - as it behaves within a java language, the @Transient only designed to answer the tasks that pertains only to persistence tasks.
如果你只是想要一个字段不会被持久化,无论是transient还是@Transient工作。但问题是,既然“瞬态”已经存在,为什么要@Transient。
因为@Transient字段仍然会被序列化!
假设你创建一个实体,做一些cpu消耗的计算来得到一个结果,这个结果不会保存在数据库中。但是您希望将实体发送给其他Java应用程序以通过JMS使用,那么您应该使用@Transient,而不是JavaSE关键字transient。因此,运行在其他vm上的接收器可以节省重新计算的时间。
推荐文章
- Java泛型什么时候需要<?扩展T>而不是<T>,切换有什么缺点吗?
- 如果性能很重要,我应该使用Java的String.format()吗?
- Python void返回类型注释
- getResourceAsStream返回null
- 如何使用Java中的Scanner类从控制台读取输入?
- 如何添加JTable在JPanel与空布局?
- Statement和PreparedStatement的区别
- 为什么不能在Java中扩展注释?
- 在Java中使用UUID的最重要位的碰撞可能性
- 转换列表的最佳方法:map还是foreach?
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- Mockito.any()传递带有泛型的接口
- 在IntelliJ 10.5中运行测试时,出现“NoSuchMethodError: org.hamcrest. matcher . descripbemismatch”
- 使用String.split()和多个分隔符