2013-01-24 87 views
0

「必須實現繼承的抽象方法」我在我的類AbstractJpaDao方法

@Override 
public EntityManager getEntityManager() { 
    return em; 
} 

現在是不是在使用,我想刪除它,但我得到的錯誤:

類型JpaAclIdentityDao必須在類JpaAclIdentityDao中實施繼承的抽象方法IJpaDao.getEntityManager()

是必要的getter?如果不是如何刪除它

我的代碼:

public abstract class AbstractJpaDao implements IJpaDao { 

protected final IApplicationConfig config; 

protected final EntityManager em; 

private final SingletonEventBus eventBus; 

public AbstractJpaDao(EntityManager entityManager, IApplicationConfig config, SingletonEventBus eventBus) { 
    checkArgument(entityManager != null); 
    checkArgument(config != null); 
    checkArgument(eventBus != null); 
    this.em = entityManager; 
    this.config = config; 
    this.eventBus = eventBus; 
} 

protected void saveEntity(IEntity entity) { 
    boolean isNew = entity.getId() == 0; 
    em.getTransaction().begin(); 
    try { 
     em.persist(entity); 
     em.getTransaction().commit(); 
     if (isNew) { 
      eventBus.post(new EntityCreatedEvent(entity)); 
     } 
    } finally { 
     if (em.getTransaction().isActive()) { 
      em.getTransaction().rollback(); 
     } 
    } 
} 



@Repository 
public class JpaAclIdentityDao extends AbstractJpaDao implements IAclIdentityDao { 



    public static final String GROUP_NAME_PATTERN = "GROUP_%d"; 

    private static final String GROUP_TEMP_NAME = "TEMP_GROUP_NAME"; 

@Inject 
public JpaAclIdentityDao(EntityManager entityManager, IApplicationConfig config, SingletonEventBus eventBus) { 
    super(entityManager, config, eventBus); 
} 

@Override 
public AclIdentity findById(Object id) throws EntityNotFoundException { 
    return em.find(AclIdentity.class, id); 
} 

@Override 
public List<AclIdentity> findAll() { 
    return findAllByType(AclIdentity.class); 
} 

@Override 
public void delete(AclIdentity entity) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void save(AclIdentity entity) { 
    saveEntity(entity); 
} 

@Override 
public AclIdentity createNew(String sid, boolean principal) { 
    AclIdentity identity = new AclIdentity(sid, principal); 
    save(identity); 
    return identity; 
} 

@Override 
public AclIdentity createNew(User entity) { 
    return createNew(entity.getEmail(), true); 
} 

@Override 
public AclIdentity createNew(Group entity) { 
    AclIdentity identity = createNew(GROUP_TEMP_NAME, false); 
    identity.setSid(String.format(GROUP_NAME_PATTERN, identity.getId())); 
    save(identity); 
    return identity; 
} 

}

回答

2

方法getEntityManagerIJpaDao(或一個超級接口)中定義,這就是爲什麼您需要在您的類中提供它的實現。

如果根本不使用它(即使通過您正在使用的某些框架內的某種反射機制),那麼您可以從IJpaDao中刪除它,並且您不會被強制執行它。

+0

這麼愚蠢的錯誤...非常感謝您的快速回答 – akuzma

1

我猜測接口IJpaDao包含getEntityManager抽象方法。

4

是的,你必須實現在實現的接口中定義的所有方法。我能想到的唯一可能的解決方案是實現該方法並將其保留爲空,或者不實現該接口。 或者,正如ben75所說的,如果你不需要它(任何地方),就刪除你的界面聲明中的方法「IJpaDao」。

2

如果你不想使用它,然後拋出UnsupportedOperationException:

public class JpaAclIdentityDao extends AbstractJpaDao ... { // Or AbstractJpaDao... 

    // Some Code... 

    public EntityManager getEntityManager() { 
     throw new UnsupportedOperationException(); 
     // return null; (This is not needed, due to the exception thrown above. Thanks dedek!) 
    } 

    // More Code... 
} 

由於OO編程,如果一個具體的類繼承了抽象方法的類/接口,你必須定義該方法,或者讓你的類抽象化並將其傳遞給線程,就像你使用AbstractJpaDao一樣。

+0

'返回null;'在這種情況下是無用的 – dedek

+0

是啊...我在某些情況下得到代碼OCD,所以這就是爲什麼我添加那。 –

相關問題