标签: hibernate-annotations

使用Hibernate @Index注释在DB上创建索引

我的项目中有注释驱动的hibernate功能.

现在我想在列上创建索引.我目前的列定义是

@NotNull
@Column(name = "hash")
private String hash;
Run Code Online (Sandbox Code Playgroud)

我在@Index这里添加注释.

@NotNull
@Column(name = "hash")
@Index(name="hashIndex")
private String hash;
Run Code Online (Sandbox Code Playgroud)

然后DROP TABLE并重启Tomcat服务器.在实例化服务器之后,会创建表,但我无法在后续查询中看到新索引.

SHOW INDEX FROM tableName
Run Code Online (Sandbox Code Playgroud)

期望用新索引构造表.我正在使用带有MySQL的InnoDB.

java annotations hibernate hibernate-annotations database-indexes

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

Java中的IncompatibleClassChangeError异常是什么?

我正在处理一个小应用程序,我正在尝试使用Hibernate Annotations来映射我的实体.当我遇到这个例外时,我想测试一切是否正常:

    Exception in thread "main" java.lang.ExceptionInInitializerError
 at fr.cc2i.intervention.dao.main.Main$HibernateUtil.<clinit>(Main.java:48)
 at fr.cc2i.intervention.dao.main.Main.test(Main.java:21)
 at fr.cc2i.intervention.dao.main.Main.main(Main.java:32)
Caused by: java.lang.IncompatibleClassChangeError: Implementing class
 at java.lang.ClassLoader.defineClass1(Native Method)
 at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
 at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
 at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
 at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
 at fr.cc2i.intervention.dao.main.Main$HibernateUtil.<clinit>(Main.java:44)
 ... 2 more
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个例外吗?这是我第一次看到它.这是我的应用程序的主要内容:

 package fr.cc2i.intervention.dao.main;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import fr.cc2i.intervention.dao.beans.Client;
import fr.cc2i.intervention.dao.beans.Contrat;

public class Main {

 public static void test(){
  Client c = new Client();
  c.setCode("123343");
  c.setAdresse("fkhdhdmh");
  c.setNom("dgsfhgsdfgs"); …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-annotations

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

每个实体休眠两个表

我有一个实体 - User.它由描述User.class.

Hibernate为每个实体创建一个表,所以当我调用时session.save(user),我的数据总是保存到该表中.

现在我需要另一个表来表示相同User类型的数据,我需要将我的实体保存到该表中.

数据结构(类似这样):

table users_1_table{
  string id;
  string username;
}

table users_2_table{
  string id;
  string username;
}
Run Code Online (Sandbox Code Playgroud)

使用这个:

session.save(user1,"users_1_table")
session.save(user2,"users_2_table")
Run Code Online (Sandbox Code Playgroud)

和结果,我应该user1users_1_tableuser2users_2_table.

由于系统限制,我不能将这两个对象放在一个表中.(即使创建额外的字段也是个坏主意).

我可以在没有子类化的情况下这样做吗?使用programmaticaly hibernate配置?

java sqlite spring hibernate hibernate-annotations

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

在Hibernate中设置属性的默认值不起作用

我的实体中有一个布尔属性.这是我对它的注释:

@Column(name = "IS_ACTIVE", nullable = false, columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
    return isActive;
}
Run Code Online (Sandbox Code Playgroud)

但是columnDefinition="BIT DEFAULT 1"没有完美的工作.这是我得到的生成表的SQL代码:

IS_ACTIVE BIT(1) NOT NULL,
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

因此,当我尝试将此类的实例保存到数据库时,我得到异常:

`com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'IS_ACTIVE' cannot be null`
Run Code Online (Sandbox Code Playgroud)

如果我删除nullable = false属性:

@Column(name = "IS_ACTIVE", columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
    return isActive;
}
Run Code Online (Sandbox Code Playgroud)

所以我可以在这种情况下保存一个创建的对象.但它仍然没有设置默认值,我在数据库中的这个字段的值中得到NULL.

有什么想法吗?如果它很重要,我使用MySQL Server 5.1.我会非常感谢任何帮助.提前致谢!

java hibernate jpa hibernate-mapping hibernate-annotations

15
推荐指数
1
解决办法
4万
查看次数

Hibernate/JPA单向OneToMany,在源表中具有常量值的连接条件

我想使用Hibernate注释来表示使用连接的单向一对多关系.我想在连接上添加一个条件,这样只有当表中的列("一")等于一个常量值时才会发生这种情况.例如.

SELECT *
FROM buildings b
LEFT JOIN building_floors bf on bf.building_id = b.id AND b.type = 'OFFICE'
Run Code Online (Sandbox Code Playgroud)

我想表示该b.type = 'OFFICE'查询的一部分.

我的问题与此问题非常相似,只是我在源表上有条件.JPA/Hibernate加入恒定价值

Java实体看起来像这样:

@Entity
@Table(name = "buildings")
public class Building {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "type")
    private String type;

    @OneToMany(mappedBy = "buildingId",
            fetch = FetchType.EAGER,
            cascade = {CascadeType.ALL},
            orphanRemoval = true)
    @Fetch(FetchMode.JOIN)
    // buildings.type = 'OFFICE'   ????
    private Set<BuildingFloors> buildingFloors;

    // getters/setters
}

@Entity
@Table(name = "building_floors")
public class BuildingFloor …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa join hibernate-annotations

15
推荐指数
1
解决办法
3612
查看次数

JPA注释 - 如何从与当前对象不同的表中检索单个值?

如何将单个值从另一个表中的列映射到当前对象?

例:

class Foo {
    @Id
    @Column(name="FOO_ID")
    private String fooId;

    @Column(name="FOO_A")
    private String fooA;

    //Column to map to another table?
    //is a one to one mapping - but don't want a separate object for this.
    private String barCode;
}
Run Code Online (Sandbox Code Playgroud)

表: Fields

富: FOO_ID, FOO_A

酒吧: FOO_ID, BAR_CODE

如何在BAR_CODE不创建单独对象(或辅助表)的情况下检索字段JPA annotations

java annotations hibernate jpa hibernate-annotations

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

使用基本实体的Hibernate Annotation

在我的项目中,我有一个名为BaseEntity的POJO,如下所示.

class BaseEntity{
    private int id;
    public void setId(int id){
        this.id=id;
    }
    public int getId(){
        return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一组其他POJO实体类,如Movie,Actor,......

class Movie extends BaseEntity{
    private String name;
    private int year;
    private int durationMins;
    //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我只使用BaseEntity将其用作某些界面中的占位符.我永远不必存储BaseEntity对象.我只需要存储从BaseEntity扩展的实体对象.我应该如何注释这些类,以便从BaseEntity扩展每个实体一个表.对于电影,它应该是(id,name,year,durationMins).

hibernate hibernate-annotations

13
推荐指数
2
解决办法
5350
查看次数

HiLo发电机策略不起作用

我是hibernate的新手.我想要做的是用于@CollectionId为我的Address类生成一个标识符.我已经使用了Collection接口.但是当我使用@GenericGenerator并将策略设置为hilo时,它会抛出异常.这是我的代码:

@Entity
@Table(name = "USER_DETAILS")
public class UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;
    private String userName;

    @ElementCollection
    @JoinTable(name="USER_ADDRESS",
        joinColumns=@JoinColumn(name="USER_ID")
    )

    @GenericGenerator(name = "hilo-gen", strategy = "hilo")
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "hilo-gen", type = @Type(type="long"))
    private Collection<Address> address = new ArrayList<Address>();

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) { …
Run Code Online (Sandbox Code Playgroud)

java collections hibernate hibernate-annotations

13
推荐指数
2
解决办法
7608
查看次数

如果存在类似的行,如何避免创建新行?

我需要配置hibernate以避免创建重复的行,(尽管该行存在它会创建一个新的行,并且因为只设置了一个字段,所以将所有其余字段设置为NULL)

可以说我有一排如下

id des    index age
1  MyName 2     23
Run Code Online (Sandbox Code Playgroud)

虽然我只是将MyName设置为des并且它已经存在于Name表中,但是hibernate会创建一个新行,如下所示

id des    index age
1  MyName 2     23
2  MyName Null  Null     << new row with null values will be created 
                            rather than updating the previous one
Run Code Online (Sandbox Code Playgroud)

当我想要sa.所以我在我的类中添加了以下注释,但是它越过了Entity和dynamicUpdate.

@org.hibernate.annotations.Entity(
  dynamicUpdate = true
)
Run Code Online (Sandbox Code Playgroud)

我也使用@DynamicUpdate过,虽然hibernate接受它但我仍然遇到同样的问题.

有没有其他方法可以做到这一点?我的hibernate版本如下

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.2.1.Final</version>
      <type>jar</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

*基于Ray的评论自爆,通过为子类的Id分配值,它可以正常工作,但如果我没有ID怎么样?我必须先做一个选择才能找到id吗?是否有任何方法强制hibernate基于child class rahter的值自动执行r而不是单独选择查找id?*

User.Java

....
import org.hibernate.annotations.DynamicUpdate;

@Entity
@Table(name = "user") 
@DynamicUpdate
public class User implements Serializable {

  private int ID;
  private Name name;
  private …
Run Code Online (Sandbox Code Playgroud)

hibernate updates hibernate-mapping java-ee hibernate-annotations

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

如何只从多个映射表加载ID到多个映射表?

在两个表之间有多对多关系的映射表之间,我怎样才能为第二个实体加载id.

以下是解释我想在这里实现的内容的示例.以下是示例模式

create table user(
 id int PrimaryKey,
 name text
)
create table pages (
 id int PrimaryKey,
 page_name text
)
create table user_page (
 id_user int,
 id_page int,
 PrimaryKey (id_user, id_page)
)
Run Code Online (Sandbox Code Playgroud)

注意:用户和页面表中还有其他列,为简洁起见,我未在此处包含这些列.

用户实体:

@Entity
@Table(name = "user")
public class User {
 @id
 @column(name="id")
 private Integer id;
 @column(name="name")
 private String name;
 ... 
 ...
}

@Entity
@Table(name = "page")
public class Page {
 @id
 @column(name="id")
 private Integer id;
 @column(name="page_name")
 private String name;
 ... 
 ...
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是Set<Integer> pageIdsUser …

hibernate hibernate-mapping hibernate-annotations

11
推荐指数
1
解决办法
5177
查看次数