我很想之间是否存在的差异javax.persistence.Id和org.springframework.data.annotation.Id.
org.springframework.data.annotation.Id有另一个[附加]目的是什么?这是我为实体设置的:
@Entity
@Getter
@Setter
@Table(name = "movies", schema = "public")
public class Movie {
@Id
@Column(name = "id")
private UUID movieId;
@OneToMany(mappedBy = "actor", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Actors> actors = new HashSet<>();
//Getters and setters
}
}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Getter
@Setter
@Table(name = "actors_movies", schema = "public")
public class ActorMovie {
@EmbeddedId
private ActorId id;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("movieId")
@JoinColumn(name = "id_movie_movie")
private Movie movie;
//Getters and setters below
}
Run Code Online (Sandbox Code Playgroud)
entityManager.merge()当我Actor向电影列表添加新内容时,我能够成功调用。以下成功保留了表格。
Movie movie = …Run Code Online (Sandbox Code Playgroud) 我试图通过 JPA 和 Spring 将一些 JSON 作为字符串存储在列中,并且正在关注baeldung 教程。我的代码是这样的:
@Column
@Convert(converter = MyEntityExtentionConverter.class)
private Map<String, Object> myEntityExtention;
Run Code Online (Sandbox Code Playgroud)
MyEntityExtentionConverter是一种javax.persistence.AttributeConverter<Map<String, Object>, String>使用 Jackson 来回转换字符串的实现ObjectMapper。
根据提到的教程,这应该是它,但是现在我收到一个错误
“基本”属性类型不应是地图
理论上我可以通过添加@SuppressWarnings("JpaAttributeTypeInspection")注释来禁用它,但这感觉就像忽略而不是解决错误。我在这里做错了什么?
在Java中可以将类注释为@Embeddable或将属性设置为@Embedded.示例代码:
@Embeddable
class A{
...
}
class B{
...
}
@Entity
class Foo {
A a;
@Embedded B b;
}
Run Code Online (Sandbox Code Playgroud)
什么时候喜欢@Embedded和@Embeddable?
我遇到了一个 Spring Web 应用程序的问题,该应用程序在从我的连接池中获取连接时会定期遇到错误。最终在日志中我看到如下条目:
一旦达到这一点,我发现的唯一恢复方法是重新启动 Tomcat。
我认为最可能的解释是我在某处有一些代码没有正确清理它的连接 - 将它返回给 Hikari,让某些东西打开所以 Spring 无法清理它,等等。
为了排除故障,我已将我的 hikari 配置 leakDetectionThreshold 设置为 5000 毫秒并启用日志记录。在那之后,我看到像这样的日志条目
2018-04-24 19:53:56 WARN ProxyLeakTask:87 - Connection leak detection
triggered for org.postgresql.jdbc.PgConnection@664ec666, stack trace
follows
java.lang.Exception: Apparent connection leak detected
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:47)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1940)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
at org.hibernate.loader.Loader.doQuery(Loader.java:932)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
at org.hibernate.loader.Loader.doList(Loader.java:2615)
at org.hibernate.loader.Loader.doList(Loader.java:2598)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
at org.hibernate.loader.Loader.list(Loader.java:2425)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在包含一列日期 (Oracle 11G) 的模型中进行条件查询 (JPA/Hibernate)。例如,我有
我的功能是这样的:
public MyEntity getEntitiesFromCertainFilters(int a, int b, java.util.date c)
{
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery< MyEntity > query = builder.createQuery(MyEntity.class);
Root< MyEntity > root = query.from(MyEntity.class);
query.select(root).where (
builder.equal ( root.get ( "id" ).get ( "codEstablec" ) , establecimiento),
builder.equal ( root.get ( "id" ).get ( "correlGrupo" ) , correlGrupo),
//HERE I NEED TO ADD FILTER BY …Run Code Online (Sandbox Code Playgroud) 我有一个覆盖方法"toPredicate"的方法:
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
我必须构建谓词.简单类型很容易,例如:
@Entity
@Table
public class Person {
@Column
private String name;
@Column
private String surname;
}
Run Code Online (Sandbox Code Playgroud)
通过这个简单的课程,我可以做到:
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(surname)) {
predicates.add(cb.equal(root.get("surname"), surname));
}
if (StringUtils.isNotBlank(name)) {
predicates.add(cb.equal(root.get("name"), name));
}
Run Code Online (Sandbox Code Playgroud)
但是如果属性是复杂类型,我如何找到复杂类型中包含的简单属性?
这是一种潜在的情况:
@Entity
@Table
public class Person {
@Column
private String name;
@Column
private String surname;
@OneToMany(fetch = FetchType.LAZY, cascade …Run Code Online (Sandbox Code Playgroud) java spring-data spring-data-jpa spring-data-rest javax.persistence
我刚开始工作的春天开机,和我目前正在跟踪这个教程有一些小的修改,命名和使用自己的版本Eclipse,它有这个发生器内置的.
当我到达第一段代码时,我尝试只复制import语句开头,
import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.HashSet;
import java.util.Set;
Run Code Online (Sandbox Code Playgroud)
这让javax导入出现以下错误:
The import javax.persistence.[insert name here] cannot be resolved
Run Code Online (Sandbox Code Playgroud)
当我找到javax.persistence包时,我发现,确实,他们自己的服务提供的入门代码不包含列出的包.我很困惑,想知道我是否在最初的步骤中做错了什么.有人有主意吗?
编辑1:提供的pom内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Me</groupId>
<artifactId>petstore</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>petstore</name>
<description>Petstore Project</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> …Run Code Online (Sandbox Code Playgroud) 我需要使用 createdDate 和 updatedDate 更新 postgres DB 我尝试使用方法 1,但它插入了空值。当我阅读时,似乎@prepersist 注释不适用于会话。
所以我决定使用方法 2 :Hibernate @CreationTimeStamp Annotation,我添加了 hibernate-annotations maven 依赖项,但是 @CreationTimeStamp 没有解析并给出编译错误。
有人可以建议我如何解决问题吗?
方法 1 使用 @Entity 和 @Table 注释的实体类
public class Status{
@Id
@Column(name = "run_id")
private int run_id;
@Column(name = "status")
private String status;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_date" , updatable=false)
private Date created;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_date" , insertable=false)
private Date updated;
@PrePersist
protected void onCreate() {
created = new Date();
}
@PreUpdate
protected void onUpdate() {
updated = new …Run Code Online (Sandbox Code Playgroud) java ×7
hibernate ×4
spring ×4
jpa ×3
spring-data ×2
eclipse ×1
hikaricp ×1
json ×1
oracle ×1
persistence ×1
spring-mvc ×1