Java Hibernate manytone映射不在PKey上

Java Hibernate manytone映射不在PKey上,java,hibernate,jpa,Java,Hibernate,Jpa,我有一些实体: @Entity public class Event{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "event_id") private long eventId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "host_id") pri

我有一些实体:

@Entity
public class Event{

    @Id    
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    @Column(name = "event_id")
    private long eventId;   

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "host_id")  
    private Host host;
}

@Entity
public class Host{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")   
    private long id;   

    @Column(name = "host_id")
    private long hostId;
}

@Repository
public class EventDao{       

   @PersistenceContext
   private EntityManager em;

   @Transactional
   public List<Event> findEventAfterId(long eventId, long hostId){
      Query q=em.createNativeQuery("SELECT * FROM event WHERE event_id>? AND host_id=?, Event.class);
      q.setParameter(1, eventId);
      q.setParameter(2, hostId);      
      return (List<Event>)q.getResultList();
   }    
}
并获取此异常
javax.persistence.EntityNotFoundException:找不到id为35的entity.Host
,但在我的数据库中我有一个id为35的主机。如何将我的事件实体映射到具有host_id列的主机??多谢各位

UPD:


请尝试将此代码用于SQLInjection

Query q=em.createNativeQuery("SELECT * FROM event WHERE event_id>:event_id AND host_id=:host_id, Event.class);
      q.setParameter("event_id", eventId);
      q.setParameter("host_id", hostId);

你的错误太小了,要解释清楚我必须在这里写很多理论,不管怎样,好消息是我有足够的耐心在这里写所有的理论

让我从事件类开始,在事件类中有主机,事件指向主机的主键

在Host类中,主键名为“id”,但在Event类中,对应的列名为Host_id

最后,您的表结构如下所示

事件中存在类host_id,但该id指向主机类的主键,即id

所以事件的host_id指向host的id列,现在让我们假设在host table中,id列由1组成,因为它是自动递增的,并且host_id=35

但在事件中,表host_id指向值为1的主机表id。 但您的查询正在事件表中搜索host_id=35。 为避免此问题,在Host类中,您必须将Host_id设置为主键,并且不会自动生成,请将手动值指定给Host_id。您可以看到以下对应的类:

@Entity
public class Event{

   @Id    
   @GeneratedValue(strategy = GenerationType.IDENTITY)  
   @Column(name = "event_id")
   private long eventId;   

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "host_id")  
   private Host host;
}

@Entity
public class Host{

   @Column(name = "id")   
   private long id;   
   @Id
   @Column(name = "host_id")
   private long hostId;
}

@Repository
public class EventDao{       

   @PersistenceContext
   private EntityManager em;

   @Transactional
   public List<Event> findEventAfterId(long eventId, long hostId){
      Query q=em.createNativeQuery("SELECT * FROM event WHERE event_id>? AND host_id=?, Event.class);
      q.setParameter(1, eventId);
      q.setParameter(2, hostId);      
      return (List<Event>)q.getResultList();
   }    
}
@实体
公开课活动{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“event\u id”)
私人长事件ID;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“主机id”)
专用主机;
}
@实体
公共类主机{
@列(name=“id”)
私人长id;
@身份证
@列(name=“host\u id”)
私人长hostId;
}
@存储库
公共类EventDao{
@持久上下文
私人实体管理者;
@交易的
公共列表FindEventId(长事件ID、长主机ID){
Query q=em.createNativeQuery(“从事件中选择*,其中事件id>和主机id=?,event.class”);
q、 setParameter(1,eventId);
q、 设置参数(2,主机ID);
返回(列表)q.getResultList();
}    
}

My bad,我有@Column(name=“event\u id”)还没有,我的SQL脚本是正确的,但是当我尝试执行(List)q.getResultList()时,我得到了异常EntityNotFoundException是否检查了数据库中的SELECT*FROM事件,其中eventId>4442;是的,当我使用q.getResultList()时如果没有hibernate映射到实体列表,我将得到结果给我所有类和完整的异常堆栈跟踪,我可以帮助你..你的宿主类没有任何意义。它本身是父子关系吗?如果是这样,你需要告诉hibernate。
    javax.persistence.EntityNotFoundException: Unable to find monitoring.reporter.entity.Host with id 35
 at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:181)
 at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:218)
 at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:274)
 at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
 at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070)
 at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:989)
 at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:716)
 at org.hibernate.type.EntityType.resolve(EntityType.java:502)
 at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:170)
 at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:144)
 at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1114)
 at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
 at org.hibernate.loader.Loader.doQuery(Loader.java:920)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
 at org.hibernate.loader.Loader.doList(Loader.java:2553)
 at org.hibernate.loader.Loader.doList(Loader.java:2539)
 at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
 at org.hibernate.loader.Loader.list(Loader.java:2364)
 at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353)
 at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1873)
 at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)
 at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)
 at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
 at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
Query q=em.createNativeQuery("SELECT * FROM event WHERE event_id>:event_id AND host_id=:host_id, Event.class);
      q.setParameter("event_id", eventId);
      q.setParameter("host_id", hostId);
@Entity
public class Event{

   @Id    
   @GeneratedValue(strategy = GenerationType.IDENTITY)  
   @Column(name = "event_id")
   private long eventId;   

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "host_id")  
   private Host host;
}

@Entity
public class Host{

   @Column(name = "id")   
   private long id;   
   @Id
   @Column(name = "host_id")
   private long hostId;
}

@Repository
public class EventDao{       

   @PersistenceContext
   private EntityManager em;

   @Transactional
   public List<Event> findEventAfterId(long eventId, long hostId){
      Query q=em.createNativeQuery("SELECT * FROM event WHERE event_id>? AND host_id=?, Event.class);
      q.setParameter(1, eventId);
      q.setParameter(2, hostId);      
      return (List<Event>)q.getResultList();
   }    
}